﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using System.Text;
using System.Xml.Serialization;
using Expand.Linq;

namespace SpellCaster3
{
    static class Program
    {
        private static volatile bool _Closing = false;

        public static bool Closing { get { return _Closing; } private set { _Closing = value; } }

        private static void LoadBaseRange()
        {
            string fileIconImageIndices = Application.StartupPath + Path.DirectorySeparatorChar + "ValidIconImageIndices.xml";
            if (!File.Exists(fileIconImageIndices)) throw new FileNotFoundException("Attenzione, il file degli indici delle immagini non è stato trovato");

            using (StreamReader reader = new StreamReader(fileIconImageIndices, Encoding.UTF8))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(RangeCollection));
                Forms.GumpPicker.BaseRange = serializer.Deserialize(reader) as RangeCollection;
            }
        }

        /// <summary>
        /// Punto di ingresso principale dell'applicazione.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
            try
            {
                LoadBaseRange();
            }
            catch (FileNotFoundException fileException)
            {
                ErrorForm.Show(fileException.Message + "\nL'applicazione verrà terminata", fileException);
                return;
            }
            catch (Exception exception)
            {
                ErrorForm.Show("L'applicazione verrà terminata", exception);
                return;
            }

            //Forms.IconForm._Descriptor.InitialDelay = SpellCaster3.Properties.Settings.Default.DescriptionInitialShowDelay;
            try
            {
                if (!string.IsNullOrWhiteSpace(SpellCaster3.Properties.Settings.Default.CustomUltimaOnlineDirectory))
                    Ultima.Client.SetUltimaOnlineDirectory(SpellCaster3.Properties.Settings.Default.CustomUltimaOnlineDirectory);
            }
            catch (InvalidOperationException)
            {
                SpellCaster3.Properties.Settings.Default.CustomUltimaOnlineDirectory = "";
                SpellCaster3.Properties.Settings.Default.Save();
                ErrorForm.Show("La directory di Ultima Online selezionata non è valida, valore resettato");
            }

            if (Environment.GetCommandLineArgs().Length > 1 && Environment.GetCommandLineArgs()[1] == "-reset")
            {
                SpellCaster3.Properties.Settings.Default.Reset();
                SpellCaster3.Properties.Settings.Default.Save();
                MessageBox.Show("Valori delle opzioni resettate, chiusura applicazione in corso", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            if (Environment.GetCommandLineArgs().Length > 1)
            {
                try
                {
                    SpellCasterManager.Load(Environment.GetCommandLineArgs()[1], true);
                    //SpellCasterManager.Load(@"C:\Users\Francesco\Desktop\test.spx", true);
                }
                catch (FileNotFoundException)
                {
                    ErrorForm.Show("File non valido o non trovato");
                    SpellCasterManager.LoadMinimized = false;
                }
                catch (Exception loadException)
                {
                    ErrorForm.Show("Apertura del file fallita probabilmente per un formato errato", loadException);
                    SpellCasterManager.LoadMinimized = false;
                }
            }

//#if !DEBUG
            try
            {
                Application.Run(new HomeForm());
            }
            catch (Exception generalException)
            {
                ErrorForm.ShowDefaultErrorBox("Errore grave, l'applicazione verrà terminata\n\nIl problema potrebbe essere legato all'impossibilità di rintracciare la directory di Ultima Online. Selezionare quella corretta nella prossima finestra di dialogo per favore." + generalException.ToString());
                try
                {
                    Tuple<DialogResult, string> res = Forms.ChooseUoDirectoryForm.Show();
                    if (res.Item1 == DialogResult.OK)
                    {
                        SpellCaster3.Properties.Settings.Default.CustomUltimaOnlineDirectory = res.Item2;
                        SpellCaster3.Properties.Settings.Default.Save();
                    }
                }
                catch (Exception bigException)
                {
                    ErrorForm.ShowDefaultErrorBox("Se viene visualizzato questo messaggio, si è verificato un errore irreversibile. Contattare il programmatore per informazioni a riguardo." + bigException.ToString());
                }
                return;
            }
//#else
//            Application.Run(new HomeForm());
//#endif
        }

        private static void Application_ApplicationExit(object sender, EventArgs e)
        {
            _Closing = true;
        }
    }
}
